缓存控制关键点

HTTP协议头

HTTP 1.0 协议头

  • Expires 绝对时间点,0或者无效时间建议解释为立即过期
  • If-Modified-Since 绝对时间点,GET请求中的条件过期,如果有满足条件的变更则返回新资源,否则返回304
  • Last-Modified 绝对时间点,上一次数据变更的时间点
  • Pragma ‘no-cache’,扩展字段为key=value的形式

HTTP 1.1协议头

  • Cache-Control
    • public 任何缓存都能存
    • private 共享缓存不能存
    • no-cache 任何缓存都不能存
    • no-store 不能存相关数据
    • max-age=delta-seconds 保质期
  • ETag 实体标签名称,W/前缀表示弱校验
  • Expires 过期时间点
  • If-Modified-Since 绝对时间点,GET请求中的条件过期,如果有满足条件的变更则返回新资源,否则返回304
  • If-Unmodified-Sice 绝对时间点
  • If-Match 逗号分隔的多个EntityTag或者*
  • If-None-Match 逗号分隔的多个EntityTag或者*
  • Last-Modified 绝对时间点,上一次数据变更的时间点
  • Pragma ‘no-cache’,扩展字段为key=value的形式

HTTP缓存机制

过期机制 减少网络交互次数

  • 优先级
    • Cache-Control:max-age > Expires,都没有的话由实现端来定
    • 多个过期时间,Date字段最新的优先

验证机制 减少网络带宽占用

  • Last-Modified Dates 之后没改就不用传
  • Entity Tag,时间精度要求高,不便于用修改时间或者用时间有问题的场景
  • 强验证和弱验证,有点变化就要更新的算强验证
  • Entity Tag本身为强验证,可以设置为弱验证
  • HTTP/1.1服务器 推荐的是设置一个强EntityTag 和一个Last-Modified值
  • HTTP/1.1客户端
    • 有EntityTag就必须用If-Match 或者 If-None-Match去校验
    • 只有Last-Modified就应该用If-Modified-Since
    • 都有的话都要

参考资料

  1. 实践这一次,彻底搞懂浏览器缓存
  2. RFC 搜 HTTP
  3. RFC 1945 HTTP 1.0
  4. RFC 2068 HTTP 1.1
  5. RFC 2616 HTTP 1.1
  6. RFC 7234 HTTP Caching
  7. RFC 7540 HTTP 2

最后更新: 2022年03月02日 03:32

原始链接: http://rawbin-.github.io/protocol/2017-10-05-http-cache-practice/

× 赞赏这个人~
打赏二维码